package utils;

import interfaz.IEntidad;

import java.util.ArrayList;
import java.util.List;

import javax.swing.JOptionPane;


import entidad.Curso;
import entidad.Horario;
import manejador.ManejadorDeCurso;
import manejador.ManejadorDeHorario;

public class MotorHorario {

	private static MotorHorario instancia = null;

	public static MotorHorario getInstancia() {
		if (instancia == null) {
			instancia = new MotorHorario();
		}
		return instancia;
	}

	public boolean isHorarioDisponiblePorAula(Horario horarioSeleccionado/*,
			int idCurso*/) {
		boolean retorno = true;
		/*Ciclo cicloActual = (Ciclo) ManejadorDeCiclo.getInstancia()
				.getEntidadPorId(idCurso);
		Curso curso = (Curso) ManejadorDeCurso.getInstancia()
				.getCursoPorHorario(horarioSeleccionado.getIdHorario());
		Ciclo cursoPasado = (Ciclo) ManejadorDeCiclo.getInstancia()
				.getEntidadPorId(curso.getIdCurso());*/
		List<IEntidad> horarios = ManejadorDeHorario.getInstancia()
				.getHorarioPorAula(horarioSeleccionado.getIdAula());
		for (int index = 0; index < horarios.size(); index++) {
			Horario horario = ((Horario) (horarios.get(index)));
			int horaInicio = Integer.parseInt(horario.getHoraEntrada().split(
					":")[0]);
			int horaFin = Integer
					.parseInt(horario.getHoraSalida().split(":")[0]);
			int horaIncioHorario = Integer.parseInt(horarioSeleccionado
					.getHoraEntrada().split(":")[0]);
			int horaFinHorario = Integer.parseInt(horarioSeleccionado
					.getHoraSalida().split(":")[0]);
			if (horario.getDia().equals(horarioSeleccionado.getDia())
					&& (horario.getHoraEntrada().equals(
							horarioSeleccionado.getHoraEntrada()) || (horaIncioHorario >= horaInicio && horaIncioHorario < horaFin))
					&& (horaFinHorario > horaInicio && horaFinHorario <= horaFin)) {

				JOptionPane
						.showMessageDialog(
								null,
								"Esta Aula tiene un Horario registrado.\nEste Horario esta en conflicto, en el dia "
										.concat(horario
												.getDia()
												.concat(
														" y en la Hora de Inicio "
																.concat(String
																		.valueOf(horaIncioHorario)))),
								"Error al Agregar Horario",
								JOptionPane.ERROR_MESSAGE);
				retorno = false;
				return retorno;
			} else {
				continue;
			}
		}
		return retorno;
	}

	public boolean isHorarioDisponiblePorProfesor(int idProfesor,
			Horario horarioSeleccionado) {
		boolean retorno = true;
		ArrayList<Curso> cursos = (ArrayList<Curso>) ManejadorDeCurso
				.getInstancia().getCursosPorProfesor(idProfesor);
		for (int index = 0; index < cursos.size(); index++) {
			ArrayList<Horario> horarios = (ArrayList<Horario>) ManejadorDeHorario
					.getInstancia().getHorarioPorCurso(
							cursos.get(index).getIdCurso());
			for (int subIndex = 0; subIndex < horarios.size(); subIndex++) {
				Horario horario = ((Horario) (horarios.get(subIndex)));
				int horaInicio = Integer.parseInt(horario.getHoraEntrada()
						.split(":")[0]);
				int horaFin = Integer.parseInt(horario.getHoraSalida().split(
						":")[0]);
				int horaIncioHorario = Integer.parseInt(horarioSeleccionado
						.getHoraEntrada().split(":")[0]);
				int horaFinHorario = Integer.parseInt(horarioSeleccionado
						.getHoraSalida().split(":")[0]);
				if (horario.getDia().equals(horarioSeleccionado.getDia())
						&& (horario.getHoraEntrada().equals(
								horarioSeleccionado.getHoraEntrada()) || (horaIncioHorario >= horaInicio && horaIncioHorario < horaFin))
						&& (horaFinHorario > horaInicio && horaFinHorario <= horaFin)) {
					JOptionPane
							.showMessageDialog(
									null,
									"Este Profesor tiene un Horario registrado.\nEste Horario esta en conflicto, en el dia "
											.concat(horario
													.getDia()
													.concat(
															" y en la Hora de Inicio "
																	.concat(String
																			.valueOf(horaIncioHorario)))),
									"Error al Agregar Horario",
									JOptionPane.ERROR_MESSAGE);
					retorno = false;
					return retorno;
				} else {
					continue;
				}
			}

		}
		return retorno;
	}

	public boolean isHorarioDisponiblePorEstudiante(int idEstudiantes,
			int idCurso) {
		boolean retorno = true;
		ArrayList<IEntidad> cursos = (ArrayList<IEntidad>) ManejadorDeCurso
				.getInstancia().getCursosInscritosEstudiante(idEstudiantes);
		ArrayList<Horario> horariosSeleccionados = (ArrayList<Horario>) ManejadorDeHorario
				.getInstancia().getHorarioPorCurso(idCurso);
		for (int index = 0; index < cursos.size(); index++) {
			ArrayList<Horario> horarios = (ArrayList<Horario>) ManejadorDeHorario
					.getInstancia().getHorarioPorCurso(
							((Curso) (cursos.get(index))).getIdCurso());
			for (int subIndex = 0; subIndex < horarios.size(); subIndex++) {
				Horario horario = ((Horario) (horarios.get(subIndex)));
				for (int x = 0; x < horariosSeleccionados.size(); x++) {
					int horaInicio = Integer.parseInt(horario.getHoraEntrada()
							.split(":")[0]);
					int horaFin = Integer.parseInt(horario.getHoraSalida()
							.split(":")[0]);
					int horaIncioHorario = Integer
							.parseInt(horariosSeleccionados.get(x)
									.getHoraEntrada().split(":")[0]);
					int horaFinHorario = Integer.parseInt(horariosSeleccionados
							.get(x).getHoraSalida().split(":")[0]);
					if (horario.getDia().equals(
							horariosSeleccionados.get(x).getDia())
							&& (horario.getHoraEntrada().equals(
									horariosSeleccionados.get(x)
											.getHoraEntrada()) || (horaIncioHorario >= horaInicio && horaIncioHorario < horaFin))
							&& (horaFinHorario > horaInicio && horaFinHorario <= horaFin)) {
						JOptionPane
								.showMessageDialog(
										null,
										"Este Estudiante tiene un Horario registrado.\nEste Horario esta en conflicto, en el dia "
												.concat(horario
														.getDia()
														.concat(
																" y en la Hora de Inicio "
																		.concat(String
																				.valueOf(horaIncioHorario)))),
										"Error al Agregar Horario",
										JOptionPane.ERROR_MESSAGE);
						retorno = false;
						return retorno;
					} else {
						continue;
					}
				}
			}
		}
		return retorno;
	}
}
